/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import control.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.DeleteMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Carlos Roberto
 */
public class ProdutoBean {

    private int id;
    private String descricao;
    private float valor;
    private int estoque;
    private String msg;

    public ProdutoBean() {
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public int getEstoque() {
        return estoque;
    }

    public void setEstoque(int estoque) {
        this.estoque = estoque;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public float getValor() {
        return valor;
    }

    public void setValor(float valor) {
        this.valor = valor;
    }

    public void limparCampos() {
        id = 0;
        descricao = "";
        valor = 0;
        estoque = 0;
    }

    public void limparMsg() {
        msg = "";
    }

    public String telaNovoProduto() {
        limparCampos();
        limparMsg();
        return "criar";
    }

    public String telaInicial() {
        limparCampos();
        limparMsg();
        return "sucesso";
    }

    public String criarProduto() {
        HttpClient http = new HttpClient();
        PutMethod put = new PutMethod("http://localhost:8080/ProjetoREST/resources/produtos");
        String xml = "<produto>"
                + "<codigo>" + id + "</codigo>"
                + "<descricao>" + descricao + "</descricao>"
                + "<valor>" + valor + "</valor>"
                + "<estoque>" + estoque + "</estoque>"
                + "</produto>";
        try {
            StringRequestEntity str = new StringRequestEntity(xml, "application/xml", "UTF-8");
            put.setRequestEntity(str);
            int status = http.executeMethod(put);
            if (status == 404) {
                msg = "Não foi possível criar produto " + id;
                limparCampos();
                return "falha";
            } else {
                msg = put.getResponseBodyAsString();
                limparCampos();
                return "sucesso";
            }
        } catch (IOException ex) {
            Logger.getLogger(ProdutoBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = "Não foi possível criar produto " + id;
            limparCampos();
            return "falha";
        }
    }

    public String alterarProduto() {
        try {
            HttpClient http = new HttpClient();
            PostMethod post = new PostMethod("http://localhost:8080/ProjetoREST/resources/produtos");
            post.addParameter("produto", String.valueOf(id));
            post.addParameter("descricao", descricao);
            post.addParameter("preco", String.valueOf(valor));
            post.addParameter("estoque", String.valueOf(estoque));
            int status = http.executeMethod(post);

            if (status == 404) {
                msg = "Não foi possível editar o produto " + id;
                limparCampos();
                return "falha";
            } else {
                msg = post.getResponseBodyAsString();
                limparCampos();
                return "sucesso";
            }
        } catch (Exception e) {
            msg = "Não foi possível editar o produto " + id;
            limparCampos();
            return "falha";
        }
    }

    public String excluirProduto() {

        HttpClient http = new HttpClient();
        DeleteMethod delete = new DeleteMethod("http://localhost:8080/ProjetoREST/resources/produtos/" + id);
        try {
            int status = http.executeMethod(delete);
            if (status == 404) {
                msg = "Não foi possível excluir o produto " + id;
                limparCampos();
                return "falha";
            } else {
                msg = delete.getResponseBodyAsString();
                limparCampos();
                return "sucesso";
            }
        } catch (IOException ex) {
            Logger.getLogger(ProdutoBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = "Não foi possível excluir o produto " + id;
            limparCampos();
            return "falha";
        }
    }

    public String consultarProduto() throws IOException, SAXException {

        HttpClient http = new HttpClient();
        GetMethod get = new GetMethod("http://localhost:8080/ProjetoREST/resources/produtos/" + id);

        try {
            int status = http.executeMethod(get);
            String str = get.getResponseBodyAsString();
            InputStream stream = new ByteArrayInputStream(str.getBytes("UTF-8"));
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(stream);
            doc.getDocumentElement().normalize();            
             
            Element codigo = (Element) doc.getElementsByTagName("codigo").item(0);
            NodeList codigos = codigo.getChildNodes();
            id = Integer.parseInt(((Node) codigos.item(0)).getNodeValue());
            
            Element desc = (Element) doc.getElementsByTagName("descricao").item(0);
            NodeList descs = desc.getChildNodes();
            descricao = ((Node) descs.item(0)).getNodeValue();
            
            Element val = (Element) doc.getElementsByTagName("valor").item(0);
            NodeList vals = val.getChildNodes();
            valor = Float.parseFloat(((Node) vals.item(0)).getNodeValue());
            
            Element est = (Element) doc.getElementsByTagName("estoque").item(0);
            NodeList ests = est.getChildNodes();
            estoque = Integer.parseInt(((Node) ests.item(0)).getNodeValue());
            
            return "sucesso";
            
        } catch (Exception ex) {
            msg = get.getResponseBodyAsString();
            limparCampos();
            return "falha";
        }
    }
}